package cn.iocoder.yudao.module.written.exam.service.writtenexam;

import cn.iocoder.yudao.framework.common.enums.WrittenExamTypeEnum;
import cn.iocoder.yudao.framework.common.vo.OptionVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.AppWrittenExamFinishReqVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.AppWrittenExamPointsScopeRespVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.AppWrittenExamSettingReqVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.AppWrittenExamSettingRespVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.AppWrittenExamStopPushAnswerReqVO;
import cn.iocoder.yudao.module.written.exam.controller.app.writtenexam.vo.llm.LlmChatReqVO;
import cn.iocoder.yudao.module.written.exam.enums.QuestionTypeEnum;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

public interface WrittenExamService {

    /**
     * 获取笔试枚举
     * {@link WrittenExamTypeEnum}
     * {@link QuestionTypeEnum}
     *
     * @return 笔试类型列表
     */
    Map<String, List<OptionVO>> getEnums();

    /**
     * 获取桌面端开启状态
     *
     * @param userId 用户ID
     * @return 桌面端开启状态
     */
    Boolean desktopStatus(Long userId);

    /**
     * 积分范围
     *
     * @return 积分范围
     */
    AppWrittenExamPointsScopeRespVO pointsScope();

    /**
     * 设置
     *
     * @param userId 用户ID
     * @param reqVO  请求
     * @return 是否成功
     */
    Boolean settingSet(Long userId, AppWrittenExamSettingReqVO reqVO);

    /**
     * 获取设置
     *
     * @param loginUserId 登录用户ID
     * @return 设置
     */
    AppWrittenExamSettingRespVO settingGet(Long loginUserId);

    /**
     * 批量上传图片文件（最多3个）
     *
     * @param userId         用户ID
     * @param userIp         用户IP
     * @param conversationId 会话id
     * @param files          文件列表
     * @param opType         操作类型
     * @return 文件ID列表 LlmFileUploadRespVO
     */
    String uploadFiles(Long userId, String userIp, String conversationId, MultipartFile[] files, Integer opType);

    /**
     * 推送答案消息（阻塞式响应）
     *
     * @param userId 用户ID
     * @param reqVO  请求
     * @param userIp 用户IP
     * @return 响应
     */
    String pushAnswerMessage(Long userId, LlmChatReqVO reqVO, String userIp);

    /**
     * 推送概要消息
     *
     * @param userId         用户ID
     * @param conversationId 会话ID
     * @return 是否成功
     */
    Boolean pushSummaryMessage(Long userId, String conversationId);

    /**
     * 停止推送答案
     *
     * @param reqVO 请求
     * @return 是否成功
     */
    Boolean stopPushAnswer(@Valid AppWrittenExamStopPushAnswerReqVO reqVO);

    /**
     * 笔试结束
     *
     * @param reqVO 请求
     * @return 是否成功
     */
    Boolean finish(AppWrittenExamFinishReqVO reqVO);

}
